package com.itheima.d5_proxy2;

import java.util.Arrays;

/**
 * 目标：使用动态代理解决实际问题，并掌握使用代理的好处。
 *
 * 模拟企业业务功能开发，并完成每个功能的性能统计
 * 需求
 * 模拟某企业用户管理业务，需包含用户登录，用户删除，用户查询功能，并要统计每个功能的耗时。
 * 分析
 * 定义一个UserService表示用户业务接口，规定必须完成用户登录，用户删除，用户查询功能。
 * 定义一个实现类UserServiceImpl实现UserService，并完成相关功能，且统计每个功能的耗时。
 * 定义测试类，创建实现类对象，调用方法。
 *
 * 本案例存在哪些问题？
 * 答：业务对象的的每个方法都要进行性能统计，存在大量重复的代码。
 *
 * 优化的关键步骤
 * 1.必须有接口，实现类要实现接口（代理通常是基于接口实现的）。
 * 3.创建一个实现类的对象，该对象为业务对象，紧接着为业务对象做一个代理对象。
 *
 * 动态代理的优点:
 * 可以在不改变方法源码的情况下，实现对方法功能的增强，提高了代码的复用。
 * 简化了编程工作、提高了开发效率，同时提高了软件系统的可扩展性，。
 * 可以为被代理对象的所有方法做代理。
 * 非常的灵活，支持任意接口类型的实现类对象做代理，也可以直接为接本身做代理。
 *
 *
 * 磊哥ppt：
 * 使用代理优化用户管理类
 * 场景
 * 某系统有一个用户管理类，包含用户登录，删除用户，查询用户等功能，系统要求统计每个功能的执行耗时情况，以便后期观察程序性能。
 * 需求
 * 现在，某个初级程序员已经开发好了该模块，请观察该模块的代码，找出目前存在的问题，并对其进行改造。
 */
public class Test {
    public static void main(String[] args) throws Exception{
        // 1、为用户业务对象new UserServiceImpl()创建出一个代理对象，然后交给userService变量记住
        UserService userService = ProxyUtil.createProxy(new UserServiceImpl());

        // 2、调用用户业务的功能。
        //然后下面走的都是代理的invoke方法，在代理的invoke方法中发现是login方法，然后统计开始时间，
        // 然后这行代码Object rs = method.invoke(userService, args);会真正的让我们的业务对象去执行登录操作，然后统计一个截止时间
        userService.login("admin", "123456");
        System.out.println("----------------------------------------------------");

        userService.deleteUsers();
        System.out.println("----------------------------------------------------");

        String[] names = userService.selectUsers();
        System.out.println("查询到的用户是：" + Arrays.toString(names));
        System.out.println("----------------------------------------------------");

    }
}
